#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
点云图像融合可视化系统启动脚本
"""

import os
import sys
import subprocess
import webbrowser
import time
import threading
from http.server import HTTPServer, SimpleHTTPRequestHandler
import socketserver

def check_dependencies():
    """检查依赖包是否安装"""
    required_packages = [
        'flask',
        'flask-cors',
        'opencv-python',
        'numpy',
        'matplotlib'
    ]
    
    missing_packages = []
    
    for package in required_packages:
        try:
            if package == 'opencv-python':
                import cv2
            elif package == 'flask-cors':
                from flask_cors import CORS
            else:
                __import__(package.replace('-', '_'))
        except ImportError:
            missing_packages.append(package)
    
    if missing_packages:
        print("❌ 缺少以下依赖包:")
        for package in missing_packages:
            print(f"   - {package}")
        print("\n请运行以下命令安装依赖:")
        print(f"pip install {' '.join(missing_packages)}")
        return False
    
    print("✅ 所有依赖包已安装")
    return True

def start_backend_server():
    """启动后端API服务器"""
    print("🚀 启动后端API服务器...")
    try:
        # 启动Flask应用
        backend_dir = os.path.join(os.getcwd(), 'backend')
        subprocess.Popen([
            sys.executable, 'backend_api.py'
        ], cwd=backend_dir)
        
        # 等待服务器启动
        time.sleep(3)
        print("✅ 后端API服务器已启动 (http://localhost:5000)")
        return True
        
    except Exception as e:
        print(f"❌ 启动后端服务器失败: {e}")
        return False

def start_frontend_server():
    """启动前端静态文件服务器"""
    print("🌐 启动前端服务器...")
    
    class CustomHTTPRequestHandler(SimpleHTTPRequestHandler):
        def end_headers(self):
            # 添加CORS头
            self.send_header('Access-Control-Allow-Origin', '*')
            self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
            self.send_header('Access-Control-Allow-Headers', 'Content-Type')
            super().end_headers()
        
        def log_message(self, format, *args):
            # 减少日志输出
            pass
    
    try:
        PORT = 8080
        # 切换到frontend目录作为静态文件服务根目录
        frontend_dir = os.path.join(os.getcwd(), 'frontend')
        os.chdir(frontend_dir)

        with socketserver.TCPServer(("", PORT), CustomHTTPRequestHandler) as httpd:
            print(f"✅ 前端服务器已启动 (http://localhost:{PORT})")
            
            # 自动打开浏览器
            def open_browser():
                time.sleep(2)
                webbrowser.open(f'http://localhost:{PORT}')
            
            threading.Thread(target=open_browser, daemon=True).start()
            
            print(f"\n🎉 点云图像融合可视化系统已启动!")
            print(f"📱 前端地址: http://localhost:{PORT}")
            print(f"🔧 后端API: http://localhost:5000")
            print(f"\n按 Ctrl+C 停止服务器")
            
            httpd.serve_forever()
            
    except KeyboardInterrupt:
        print("\n👋 服务器已停止")
    except Exception as e:
        print(f"❌ 启动前端服务器失败: {e}")

def create_sample_data():
    """创建示例数据文件夹结构"""
    sample_dir = "sample_data"
    if not os.path.exists(sample_dir):
        os.makedirs(sample_dir)
        print(f"📁 创建示例数据文件夹: {sample_dir}")
        
        # 创建说明文件
        readme_content = """# 示例数据说明

请将您的KITTI数据集文件放置在此文件夹中：

## 文件结构
```
sample_data/
├── pointcloud/     # 点云文件 (.bin)
├── images/         # 图像文件 (.png/.jpg)
├── calibration/    # 标定文件 (.txt)
└── README.md       # 本说明文件
```

## 文件格式要求

### 点云文件 (.bin)
- KITTI格式的二进制文件
- 每个点包含 x, y, z, intensity 四个float32值
- 文件大小通常在几MB到几十MB

### 图像文件 (.png/.jpg)
- 对应的相机图像
- 支持PNG和JPEG格式
- 建议分辨率不超过2048x1024

### 标定文件 (.txt)
- KITTI标定格式
- 包含相机内参、外参等信息
- 格式参考KITTI数据集标准

## 使用方法
1. 将对应的文件放入相应文件夹
2. 在Web界面中上传文件
3. 点击"开始融合处理"按钮
4. 查看可视化结果
"""
        
        with open(os.path.join(sample_dir, "README.md"), 'w', encoding='utf-8') as f:
            f.write(readme_content)
        
        # 创建子文件夹
        for subdir in ['pointcloud', 'images', 'calibration']:
            os.makedirs(os.path.join(sample_dir, subdir), exist_ok=True)

def main():
    """主函数"""
    print("=" * 60)
    print("🎯 点云图像融合可视化系统启动器")
    print("=" * 60)
    
    # 检查依赖
    if not check_dependencies():
        return
    
    # 创建示例数据文件夹
    create_sample_data()
    
    # 检查必要文件
    required_files = [
        '../frontend/index.html',
        '../frontend/styles.css',
        '../frontend/app.js',
        'backend_api.py',
        'fusion_web.py'
    ]
    missing_files = [f for f in required_files if not os.path.exists(f)]
    
    if missing_files:
        print("❌ 缺少以下必要文件:")
        for file in missing_files:
            print(f"   - {file}")
        return
    
    print("✅ 所有必要文件已就绪")
    
    # 启动后端服务器
    if not start_backend_server():
        return
    
    # 启动前端服务器
    start_frontend_server()

if __name__ == '__main__':
    main()
